// 封装通用性CRUD接口
module.exports= app =>{
    const express = require('express')
    const jwt = require('jsonwebtoken')
    const assert = require('http-assert')
    const AdminUser = require('../../models/AdminUser')
    const router = express.Router({
       mergeParams:true    //保留来自父路由器的req.params值
    })

    router.post('/',async(req,res)=>{
      //  console.log(req.body);
       const model = await req.Model.create(req.body)
      //  console.log(model);
       res.send(model)
    })
    router.get('/',async (req,res,next)=>{
       const token = String(req.headers.authorization||'').split(' ').pop()
      //  console.log(token)
       assert(token,401,'请提供jwt token')
       const { id } = jwt.verify(token,app.get('secret'))
       assert(token,401,'无效的jwt token')

      //  把用户信息挂载到req上
       req.user = await AdminUser.findById(id)
      //  console.log(req.user+'hahaha')
       assert(req.user,401,'请先登录')
       await next()
    },async(req,res)=>{
       let queryOptions = {}
       if(req.Model.modelName === 'Category'){
          queryOptions.populate = 'parent'
       }
        const items = await req.Model.find().setOptions(queryOptions).limit(30)
        res.send(items)
     })
     router.get('/:id',async(req,res)=>{
        const model = await req.Model.findById(req.params.id)
        res.send(model)
     })
     //   更新
     router.put('/:id',async(req,res)=>{
        const model = await req.Model.findByIdAndUpdate(req.params.id,req.body)
        console.log(model);
        res.send(model)
     })
      //   删除
     router.delete('/:id',async(req,res)=>{
        console.log(await req.Model.findByIdAndDelete(req.params.id))
        res.send({
            success:true
        })
     })

     //   登录校验中间件   
     //   返回两个函数
     const authMiddleware = require('../../middleware/auth')
     const resourceMiddleware = require('../../middleware/resource')
     
     app.use('/admin/api/rest/:resource',authMiddleware(),resourceMiddleware(),router)

    //  处理接受上传的图片
    const multer = require('multer')
    const upload = multer({dest : __dirname+'/../../uploads'})
    app.post('/admin/api/upload',authMiddleware(),upload.single('file'),async(req,res)=>{
      const file = req.file
      file.url = `http://localhost:3000/uploads/${file.filename}`
      res.send(file)
    })

   //  登录接口
   app.post('/admin/api/login',async(req,res)=>{
      const {password,username} = req.body
      // 1、根据用户名找用户
      // 取到用户的密码
      const oneUser = await AdminUser.findOne({username}).select('+password') 
      // console.log(oneUser)
      assert(oneUser,422,'用户不存在')
      // 等于下面的代码
      // if(!oneUser){
      //    return res.status(422).send({
      //       message:'用户不存在'
      //    })
      // }

      // 2、校验密码 比较明文和密文 假如没输入密码
      const isVaild = require('bcryptjs').compareSync(password||'',oneUser.password)
      // console.log(isVaild)
      // 等于下面的代码
      assert(isVaild,422,'账号或密码错误')
      // if(!isVaild){
      //    return res.status(422).send({
      //       message:'账号或密码错误'
      //    })
      // }
      // 返回token
    
      const token = jwt.sign({
         // 只放了用户的id 放入密钥 jsonverify
         id:oneUser._id
      },app.get('secret'))
      // console.log(token);
      res.send({code:20000,message:'ok',data:{token}})
   })

   // 错误处理函数 配合assert使用
   app.use(async (err,req,res,next)=>{
      console.log(err)
      res.status( err.statusCode|| 500).send({
         message:err.message
      })
   })

}